﻿using SkiaSharp;
using System.Diagnostics;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace ShuiyinSkiaSharpDemo01
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            AddWaterMark();
        }

        void AddWaterMark()
        {
            // 加载原始图片
            using (var originalImage = SKBitmap.Decode("D:\\ImageConvert\\2024\\04\\07\\15\\input.jpg"))
            {
                // 创建一个画布
                using (var canvas = new SKCanvas(originalImage))
                {
                    // 设置水印文本（多行）
                    string[] watermarkLines = {
                    "Line 1: My Watermark",
                    "Line 2: SkiaSharp is awesome!",
                    "Line 3: 2023-10-01"
                };

                    // 创建画笔
                    var paint = new SKPaint
                    {
                        Color = SKColors.White.WithAlpha(128), // 设置颜色和透明度
                        TextSize = 10, // 设置字体大小
                        IsAntialias = true, // 启用抗锯齿
                        Typeface = SKTypeface.FromFamilyName("Arial", SKFontStyle.Bold) // 设置字体
                    };

                    // 设置水印的起始位置
                    float x = 20; // 水印的X坐标
                    float y = 50; // 水印的起始Y坐标
                    float lineHeight = paint.TextSize + 10; // 行高（字体大小 + 间距）

                    // 逐行绘制水印文本
                    foreach (var line in watermarkLines)
                    {
                        canvas.DrawText(line, x, y, paint);
                        y += lineHeight; // 更新下一行的Y坐标
                    }

                    // 保存带有水印的图片
                    using (var image = SKImage.FromBitmap(originalImage))
                    using (var data = image.Encode(SKEncodedImageFormat.Jpeg, 100))
                    using (var stream = System.IO.File.OpenWrite("output.jpg"))
                    {
                        data.SaveTo(stream);
                    }
                }
            }
        }

        void TestSkiaSharp()
        {
            // 加载原始图片
            using (var originalImage = SKBitmap.Decode("D:\\ImageConvert\\2024\\04\\07\\15\\input.jpg"))
            {
                int iterations = 10000; // 测试的迭代次数
                Stopwatch stopwatch = new Stopwatch();

                Console.WriteLine("开始性能测试...");

                // 开始计时
                stopwatch.Start();

                // 使用 Parallel.For 进行并行测试
                Parallel.For(0, iterations, i =>
                {
                    // 创建一个画布
                    using (var canvas = new SKCanvas(originalImage))
                    {
                        // 设置水印文本（多行）
                        string[] watermarkLines = {
                    "Line 1: My Watermark",
                    "Line 2: SkiaSharp is awesome!",
                    "Line 3: 2023-10-01"
                    };

                        // 创建画笔
                        var paint = new SKPaint
                        {
                            Color = SKColors.White.WithAlpha(128), // 设置颜色和透明度
                            TextSize = 10, // 设置字体大小
                            IsAntialias = true, // 启用抗锯齿
                            Typeface = SKTypeface.FromFamilyName("Arial", SKFontStyle.Bold) // 设置字体
                        };

                        // 设置水印的起始位置
                        float x = 20; // 水印的X坐标
                        float y = 50; // 水印的起始Y坐标
                        float lineHeight = paint.TextSize + 10; // 行高（字体大小 + 间距）

                        // 逐行绘制水印文本
                        foreach (var line in watermarkLines)
                        {
                            canvas.DrawText(line, x, y, paint);
                            y += lineHeight; // 更新下一行的Y坐标
                        }
                    }

                    // 保存带有水印的图片
                    using (var image = SKImage.FromBitmap(originalImage))
                    using (var data = image.Encode(SKEncodedImageFormat.Jpeg, 100))
                    using (var stream = System.IO.File.OpenWrite($"output{i + 1}.jpg"))
                    {
                        data.SaveTo(stream);
                    }
                });
                    
                   

                // 停止计时
                stopwatch.Stop();

                // 输出性能测试结果
                Console.WriteLine($"性能测试完成，共进行 {iterations} 次水印添加。");
                Console.WriteLine($"总耗时: {stopwatch.ElapsedMilliseconds} 毫秒");
                Console.WriteLine($"平均每次水印添加耗时: {(double)stopwatch.ElapsedMilliseconds / iterations} 毫秒");

                this.Dispatcher.Invoke(() =>
                {
                    // 显示结果
                    TextBlock1.Text = ($"性能测试完成，共进行 {iterations} 次水印添加。\n总耗时: {stopwatch.ElapsedMilliseconds} 毫秒\n平均每次水印添加耗时: {(double)stopwatch.ElapsedMilliseconds / iterations} 毫秒");
                });

                // 保存带有水印的图片
                using (var image = SKImage.FromBitmap(originalImage))
                using (var data = image.Encode(SKEncodedImageFormat.Jpeg, 100))
                using (var stream = System.IO.File.OpenWrite("output.jpg"))
                {
                    data.SaveTo(stream);
                }

                Console.WriteLine("带有水印的图片已保存为 output.jpg");
            }
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            TestSkiaSharp();
        }
    }
}